package company

import Company._
import java.util.GregorianCalendar
import java.util.Calendar

object System {

  def main(args: Array[String]) {
    
	val comm1  = LocalCall(new GregorianCalendar(2013, 03, 12), 1526845231, 623)
	val comm2  = LocalCall(new GregorianCalendar(2013, 03, 12), 1526845222, 350)
	val comm3  = LocalCall(new GregorianCalendar(2013, 03, 10), 1526845666, 280)
	val comm4  = LongDistanceCall(new GregorianCalendar(2013, 03, 15), 1526845158, 300, "Buenos Aires", "Lima")
	val comm5  = LongDistanceCall(new GregorianCalendar(2013, 03, 10), 1526845225, 170, "Buenos Aires", "Washington")
	val comm6  = TextMessage(new GregorianCalendar(2013, 03, 22), 1526845220, 100)
	val comm7  = TextMessage(new GregorianCalendar(2013, 03, 05), 1526845145, 220)
	val comm8  = LongDistanceCall(new GregorianCalendar(2013, 03, 22), 1526845225, 200, "Buenos Aires", "Catamarca")
	val comm9  = LongDistanceCall(new GregorianCalendar(2013, 03, 23), 1526845562, 270, "Buenos Aires", "Catamarca")
	val comm10 = TextMessage(new GregorianCalendar(2013, 03, 15), 1526845145, 250)
	
	val plan1 = new FriendlyCity("Lima")
	val plan2 = new FriendlyNumbers(List(1526845666))
	val plan3 = new TalkingSoMuch
	val plan4 = new FriendlyNumbers(List(1526845222))
	val plan5 = new FriendlyCity("Catamarca")
	val plan6 = new FriendlyCity("Washington")
	val plan7 = new LocalPrepaid()
	val plan8 = new InternationalPrepaid()
	
	val client1 = new Client("Juan", List(comm1, comm2, comm4), List(plan1, plan4, plan7))
	val client2 = new Client("Jorge", List(comm3, comm7, comm8, comm9), List(plan2, plan5))
	val client3 = new Client("Pepe", List(comm5, comm6, comm10), List(plan8))
	
	val company = new Company(List(client1, client2, client3))
	
	/**Ejercicio 1.1 **/
	println("Minutos totales de " + client1.name + " : " + company.getTotalMinutesOfIn(client1, 03))
	println("Minutos totales de " + client2.name + " : " + company.getTotalMinutesOfIn(client2, 03))
	println("Minutos totales de " + client3.name + " : " + company.getTotalMinutesOfIn(client3, 03))
	
	/**Ejercicio 1.3 **/
	println("Comunicaciones largas de " + client1.name + " : " + company.getMonthlyLongCommunicationsOf(client1, 03))
	println("Comunicaciones largas de " + client2.name + " : " + company.getMonthlyLongCommunicationsOf(client2, 03))
	println("Comunicaciones largas de " + client3.name + " : " + company.getMonthlyLongCommunicationsOf(client3, 03))
	
	/**Ejercicio 1.4 **/
	println("Ciudades a las que llamó " + client1.name + " : " + company.getCitysOnLongDistanceCallsOfIn(client1, 03))
	println("Ciudades a las que llamó " + client2.name + " : " + company.getCitysOnLongDistanceCallsOfIn(client2, 03))
	println("Ciudades a las que llamó " + client3.name + " : " + company.getCitysOnLongDistanceCallsOfIn(client3, 03))
	
	/**Ejercicio 1.5 **/
	println("El día que más llamó " + client1.name + " : " + company.getMaxCommunicationsDayOf(client1, 03))
	println("El día que más llamó " + client2.name + " : " + company.getMaxCommunicationsDayOf(client2, 03))
	println("El día que más llamó " + client3.name + " : " + company.getMaxCommunicationsDayOf(client3, 03))
	
	/**Ejercicio 2.1 **/
	println("Quién más llamó en el mes fue: " + company.getTheMostChatterboxIn(03))
	
	/**Ejercicio 2.2 **/
	println("El cliente moroso del mes fue: " + company.getTheMostDefaulterIn(03))
	
	/**Ejercicio 2.3 **/
	println("El cliente con más comunicaciones largas fue: " + company.getTheMostLongDistanceCallerIn(03))
	
	/**Ejercicio 3.2 **/
	val comm11 = LongDistanceCall(new GregorianCalendar(2013, 03, 20), 1526845200, 350, "Buenos Aires", "Lima")
	val comm12 = LongDistanceCall(new GregorianCalendar(2013, 03, 10), 1526845201, 600, "Buenos Aires", "Lima")
	val comm13 = LongDistanceCall(new GregorianCalendar(2013, 03, 13), 1526845202, 585, "Buenos Aires", "Lima")
	val comm14 = LongDistanceCall(new GregorianCalendar(2013, 03, 30), 1526845203, 248, "Buenos Aires", "Lima")
	val comm15 = LongDistanceCall(new GregorianCalendar(2013, 03, 23), 1526845204, 658, "Buenos Aires", "Lima")
	val comm16 = LongDistanceCall(new GregorianCalendar(2013, 03, 10), 1526845205, 300, "Buenos Aires", "Lima")
	
	val client4 = new Client("Julian", List(comm11, comm12, comm13, comm14, comm15, comm16), List(plan1))
	
	println("El mejor plan para " + client1.name + " es: " + company.chooseTheBestPlanFor(client1))
	println("El mejor plan para " + client2.name + " es: " + company.chooseTheBestPlanFor(client2))
	println("El mejor plan para " + client3.name + " es: " + company.chooseTheBestPlanFor(client3))
	println("El mejor plan para " + client4.name + " es: " + company.chooseTheBestPlanFor(client4))
	
	/**
	* TP 2
	**/
	/** Ejercicio 1.1 **/
	println("Factura mensual de " + client1.name + " con planes incluidos: " + company.getMonthlyInvoiceOf(client1, 03) + " centavos")
	println("Factura mensual de " + client2.name + " con planes incluidos: " + company.getMonthlyInvoiceOf(client2, 03) + " centavos")
	println("Factura mensual de " + client3.name + " con planes incluidos: " + company.getMonthlyInvoiceOf(client3, 03) + " centavos")
	
	/** Ejercicio 1.2 **/
	println("La mejor combinación para " + client1.name + " es: " + company.chooseTheBestCombinationFor(client1, List(List(plan1, plan2, plan5),
	                                                                                                                  List(plan3, plan4, plan7),
	                                                                                                                  List(plan2, plan4),
	                                                                                                                  List(plan1, plan5, plan3))))
	
	println("La mejor combinación para " + client2.name + " es: " + company.chooseTheBestCombinationFor(client2, List(List(plan1, plan2, plan3),
	                                                                                                                  List(plan3, plan4, plan5, plan8),
	                                                                                                                  List(plan2),
	                                                                                                                  List(plan1, plan2, plan3, plan4))))
	
	println("La mejor combinación para " + client3.name + " es: " + company.chooseTheBestCombinationFor(client3, List(List(plan1, plan2),
	                                                                                                                  List(plan3, plan5, plan7),
	                                                                                                                  List(plan2, plan4),
	                                                                                                                  List(plan1, plan3, plan8),
	                                                                                                                  List(plan6))))
  }
}